#include <stdio.h>
// 变长参数头文件
#include <stdarg.h>

/*
| `va_list`  | 定义参数列表指针 |
| ---------- | ---------------- |
| `va_start` | 初始化参数列表   |
| `va_arg`   | 获取下一个参数   |
| `va_end`   | 清理参数列表     |
*/

char* ArgStr = NULL;
int n = 0;
void my_send_char(char chr) {
    printf("%c", chr);
    }


void my_printf(const char *str,...)
{
    // 第一个存位置 第二个存类型
    // unsigned int type_index[128][2] = {0};
    // 初始化参数记录变量
    // int val_agr = 0; 

    // for (size_t i = 0; '\0' != str[i]; i++)
    // {
    //     if ('%' == str[i])
    //     {

    //         // 存储位置
    //         type_index[val_agr][0] = i;
    //         // 存储类型
    //         type_index[val_agr][1] = str[i + 1];
    //         // 更新参数个数变量
    //         val_agr++;
    //     }
    // }

    // 创建列表
    va_list arg_list;

    // 初始化列表
    va_start(arg_list, str);

    for (size_t i = 0; '\0' != str[i]; i++)
    {
        switch (str[i]) {
            case ' ' :
            case '\t':
            case '\r':
            case '\n':
                my_send_char(str[i]);
                break;
            case '%':
                i++;
                switch (str[i])
                {
                    case 'd':
                        printf("%d", (char)va_arg(arg_list, int));
                        break;
                    case 'f':
                        printf("%f", va_arg(arg_list, double));
                        break;
                    case 's':
                        ArgStr = va_arg(arg_list, char *);
                        while (*ArgStr)
                        {
                            my_send_char(*ArgStr);
                            ArgStr++;
                        }
                        break;
                    case 'c':
                        my_send_char((char)va_arg(arg_list, int));
                        break;
                    default:
                        my_send_char(' ');
                        break;
                }
            break;
            default:
                my_send_char(str[i]);
                break;
        }
    }

    va_end(arg_list);


}

int main(int argc, char const *argv[])
{
    // print(4 , 20 , 30 , 40 , 50);

    printf("使用printf打印: 张三 %d 李四 %f %c %s\n", 13, 13.4 , 'C' , "张三");

    my_printf("使用my_printf打印: 张三 %d 李四 %f %c %s\n", 13, 13.4 , 'C' , "张三");
    return 0;
}